<?php

/*
 * Autor: Ivan R. (ivan.rodriguez.o@gmail.com)
 * Descripcion: Script para solicitar tokens de acceso OAuth 2 para la API de
 *              Facebook. La guarda en $_SESSION['token_acceso_facebook']. Tambien guarda la
 *              hora en que expira el token en $_SESSION['expira_token_facebook']
 *              para comprobar su validez
 *
 *              Si se requieren permisos extendidos, se pasan por GET:
 *              ej: manejadorTokensFacebook.php?permisos=user_photos,user_likes
 *
 */

session_start();
include('codigosApis.config');
$urlPropio = 'http://localhost/web-me/app/oauth2/manejadorTokensFacebook.php';
/*
 * Caso en el que ya obtuvimos el token de acceso. Entonces solo debemos verificar
 * que todavia sea valido
 */
if (isset($_SESSION['token_acceso_facebook'])) {
    // Verificamos que no haya expirado con el tiempo actual y el de expiracion
    if(time() >= $_SESSION['expira_token_facebook']) {
        unset($_SESSION['token_acceso_facebook']);
        unset($_SESSION['expira_token_facebook']);
        header('location: ' . $urlPropio);
    }
    echo 'Habemus token!: ' . $_SESSION['token_acceso_facebook'];
}
/*
 * Caso en el que el proveedor de la API llama esta pagina dandonos como parametro
 * el codigo que debemos usar para solicitar un token de acceso.
 * Entonces debemos hacer una peticion GET o POST para obtener el access token, el cual
 * generalmente es retornado como un JSON
 */
elseif (isset($_GET['code'])) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, 'https://graph.facebook.com/oauth/access_token?client_id=' . FACEBOOK_CLIENT_ID . '&redirect_uri=' . $urlPropio . '&client_secret=' . FACEBOOK_CLIENT_SECRET . '&code=' . $_GET['code']);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    $strRespuesta = curl_exec($curl);
    if ($strRespuesta == false) {
        echo 'Error curl en la peticion: ' . curl_error($curl);
    }
    // Convierte un string con parametros URL en un arreglo
    parse_str($strRespuesta, $arrRespuestas);
    // Inicializa la variabla de sesion que contiene el token de acceso
    $_SESSION['token_acceso_facebook'] = $arrRespuestas['access_token'];
    // Guarda la hora en que se genero el token
    $_SESSION['expira_token_facebook'] = time()+$arrRespuestas['expires'];
    // Recarga la pagina
    header('location: ' . $urlPropio);
    return;
}
/*
 * Caso en el que el usuario no acepto darnos acceso a los permisos solicitados
 */
elseif (isset($_GET['error'])) {
    echo '<h1>El usuario denego el acceso a nuestra aplicacion: </h1>';
    echo '<pre>';
    print_r($_GET);
    echo '</pre>';
    return;
}
/*
 * Caso en el que no hay codigo de acceso ni token de acceso. Entonces debemos
 * redireccionar al usuario a la pagina OAuth donde se le pide si aprueba o deniega
 * el accesso de nuestra aplicacion a sus datos con el proveedor de la API
 */
 else {
    $permisosRequeridos = '';
    if (isset($_GET['permisos']))
        $permisosRequeridos = '&scope=' . $_GET['permisos'];
    // Si usamos header para redireccionar da problemas :S ?? Entonces con JScript
    echo '<script type=\'text/javascript\'>top.location.href = \'https://www.facebook.com/dialog/oauth?client_id=' . FACEBOOK_CLIENT_ID . '&redirect_uri=' . $urlPropio . $permisosRequeridos . '\';</script>';
    return;
}
?>
